#include <iostream>
#include <exception>
#include <stdexcept> 

using namespace std;

/*
	 抛类类型的异常
	    第一种情况：程序员认真读书，得知C++本身定义很多异常类，可以直接抛这些异常类
		     throw  异常类的对象
		第二种情况：程序员自定义一个异常类，继承exception，然后重写exception的同名虚函数what
		            virtual const char* what() const
*/

int fun(int n)
{
	if(n>=0)
		return 0; //成功
	else 
	{
		//创建out_of_range对象
		out_of_range myerr("我错了，我不该越界");
		throw myerr;
	}	
}

//自定义异常类
class Funerr:public exception
{
public:
	const char *what()
	{
		cout<<"这个是我自定义的异常类"<<endl;
		return "出错了";
	}
};

int otherfun(int n)
{
	if(n>=0)
		return 0; //成功
	else 
	{
		//创建自定义异常对象
		Funerr myerr;
		throw myerr;
	}	
}
int main()
{
	try  //尝试
	{
		//fun(-12);     //失败，catch捕捉out_of_range异常
		otherfun(-55);  //失败，catch捕捉Funerr异常
	}catch(out_of_range &myout)
	{
		cout<<"函数调用失败，fun抛出了out_of_range异常"<<endl;
		//打印out_of_range传递过来的信息
		cout<<"out_of_range传递过来的信息是: "<<myout.what()<<endl;
	}catch(Funerr &myout)
	{
		cout<<"函数调用失败，fun抛出了Funerr异常"<<endl;
		//打印Funerr传递过来的信息
		cout<<"Funerr传递过来的信息是: "<<myout.what()<<endl;
	}
}